package com.cskaoyan.javase.array._0introduction;
/**
 * 引入:
 * 假设一个班上有80个人，现在需要统计，某一门课程的平均成绩，是否需要定义80个变量？
 * 编写一个程序，需要储存12个月份的天数，是否要定义12个变量呢？
 * 编写一个扑克程序，需要储存54张扑克的信息，是否要定义54个变量？
 * 如果程序需要储存上成千上万的数据，程序员是不是也要逐一定义成千上万个变量呢？
 *
 * 很明显，如果程序需要多少数据，就要定义多少个变量，也太过于麻烦了
 * 并且多个变量单独存在没有任何关联，也不方便管理和维护。
 *
 * 这样就好比，去超市购物，谁有人会把东西一个一个带回家。
 * 购物需要"袋子"装东西，Java变量也需要一个容器来存放它们。
 * Java的容器有很多，最基本的容器就是数组（Array），定义一个数组，就可以存储很多数据。
 *
 * 数组是一种容器,可以用来存储多个数据.
 *
 * 思考：
 * 数组中的数据是胡乱的摆放在一起吗？数组对装在里面的数据有什么要求吗？
 *
 * 数组的明确定义: 数组是存储多个，具有相同数据类型的数据元素的有序容器（集合）。
 *
 * 定义中的重点是：
 *      1.能够存储多个数据元素,数组是一种容器
 *      2.数组中存储的数据元素,它们的数据类型，必须一致.而且数组中元素的数据类型代表该数组的类型
 *          比如一个数组中如果存放int元素,那么它就是一个int数组
 *          String类型的数组,就只能存放String类型元素
 *      3.数组中存储的数据是有序的：
 *          数组中的每个元素都有自身的存储单元,而每个存储单元，都有唯一编号(下标)
 *          这个编号从0开始,最大值是长度-1
 *          这种编号，专业的术语称之为下标或者索引（index）
 * 补充：
 *      1.数组本身是一种引用数据类型,定义数组,本身也是定义数组变量,是定义了一个引用数据类型的变量
 *          只不过这种引用数据类型的变量可以作为容器存储其它数据.
 *      2.数组里面，可以存储基本数据类型，也可以存储引用数据类型，但是一个数组里面只能存储同一种数据类型。
 *
 *
 * 数组的随机访问/数组的优缺点:
 * 思考:
 *      数组这种容器对存储的元素数据类型要求必须一致,而且要求这些数据元素必须是有序的
 *      那么数组的限制这么多,得到了什么呢?
 *      数组的优缺点是什么?
 *
 * 从数据结构上来看,数组是线性表的一种典型物理实现，它是用一段连续的内存空间，来存储具有相同数据类型的数据
 * 这就表明,数组对内存空间的要求是很高的,必须给数组开辟一片连续的内存空间,存储数据
 * 这导致-->
 *      在给数组开辟内存空间之前,必须事先规划好内存空间
 * --->
 *      数组的内存空间一旦确定,那么就是不可更改的
 * -->
 *      从实际的表现形式上来说,数组的长度一旦确定,那么就不可更改
 *      比如在内存中创建了一个长度为10的数组,那么该数组容器除非被销毁掉,否则长度永远是10
 *      这就是数组的最大缺点,作为容器,它的长度是不变的.
 * -->
 *      这要求我们在使用数组时,必须事先明确好数组容器需要的长度
 *      这个长度如果过长,很明显不好,浪费内存空间
 *      长度如果过短,那数组根本就不可用
 *      所以实际开发中,直接使用数组作为容器,是非常罕见的
 *      但数组是基础容器,必须熟练掌握它
 *
 * 数组的优点,是访问快,这有赖于数组的随机访问
 * 随机访问：指的是在访问某个元素时，无需经过其它元素，直接定位访问它
 * 非随机访问：指的是访向某个元素时，需要先访问其它元素。
 * 显然随机访问的效率很高，时间复杂度是常数级别的O(1)。
 *
 * 数组的随机访问之所以能够实现,都有赖于数组存储空间连续且存储相同数据类型.
 *
 * 扩展:
 *      1.数组的下标为什么是从0开始的?
 *          为了方便寻址公式计算,减少一次减法的步骤
 *          这是为了方便计算机,当然这并不方便人,不符合人的思维
 *      2.有符号数存储整数为什么要存储补码,而不是原码?
 *          都是为了方便计算机
 *      3.在Java中数组是基本容器,但它的优缺点都非常显著,所以在开发中几乎不会直接使用数组
 *          而是将数组封装一层,充分利用它的优点,尽量规避它的缺点
 *          比如Java的高级容器集合,都是这么设计得来的
 *
 * @since 09:32
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {

    }
}
